/// impl study
//`impl_t` 是 Rust 中的关键字之一，用于定义类型的方法和实现 trait。
//使用 `impl` 关键字来定义一个类型（struct、enum、tuple struct 等）的方法。
//例如，以下代码定义了一个名为 `Person` 的结构体，并为其定义了两个方法：
pub struct Person {
    pub name: String,
    pub age: u8,
}
impl  Person {
    // 定义一个带有参数的方法
    pub fn get_name(&self) {
        println!("Hello, my name is {}", self.name);
    }
    // 定义一个返回值的方法
    pub fn get_age(&self) -> u8 {
        self.age
    }
}

pub fn new_person(){
    let p = Person {
        name: String::from("Alice"),
        age: 30,
    };
    // 调用 Person 类型的方法
    p.get_name();
    let age = p.get_age();
    println!("I am {} years old", age);
}



//实现 trait
//使用 `impl` 关键字来实现 trait。trait 是 Rust 中一种定义共享行为的机制。
//当一个类型实现了某个 trait，它就会获得该 trait 所定义的所有方法。
//例如，以下代码定义了一个名为 `Summary` 的 trait，并为 `NewsArticle` 和 `Tweet` 结构体分别实现了这个 trait

trait Summary {
    fn summarize(&self) -> String;
}

struct NewsArticle {
    headline: String,
    author: String,
    content: String,
}

impl Summary for NewsArticle {
    fn summarize(&self) -> String {
        format!("{}, by {} ({})", self.headline, self.author, self.content.len())
    }
}

struct Tweet {
    username: String,
    content: String,
    reply: bool,
    retweet: bool,
}

impl Summary for Tweet {
    fn summarize(&self) -> String {
        format!("{}: {}", self.username, self.content)
    }
}
fn trait_test(){
    let news = NewsArticle {
        headline: String::from("Breaking news"),
        author: String::from("John Doe"),
        content: String::from("Lorem ipsum dolor sit amet"),
    };
    let tweet = Tweet {
        username: String::from("Alice"),
        content: String::from("Hello, world!"),
        reply: false,
        retweet: false,
    };

    // 调用实现了 Summary trait 的方法
    println!("{}", news.summarize());
    println!("{}", tweet.summarize());
}



